<?php
/** 
 * Servicio para administracion de regiones y ciudades.
 * @author gemu
 * 
 * 
 */
class LocalidadService
{
	/**
	 * Da de alta una región.
	 * @param Region $region
	 */
	public function altaRegion($region) {
		Validator::validarNoVacio($region, 'region');
		Validator::validarNoVacio($region->nombre, 'nombre');
		
		try {
			$query = "INSERT INTO region(nombre) VALUES('".$region->nombre."')";
			Database::operacion($query);
		} catch (FatalException $e) {
			if($e->srcCode == 1062) {
				throw new ServiceException('error.registro_ya_existe');
			}
		}
	}
	
	/**
	 * da de alta una ciudad.
	 * @param Ciudad $ciudad
	 */
	public function altaCiudad($ciudad) {
		Validator::validarNoVacio($ciudad, 'ciudad');
		Validator::validarNoVacio($ciudad->nombre, 'nombre');
		Validator::validarNumero($ciudad->codRegion, 1, null, 'codRegion');
		
		try {
			$query = "INSERT INTO ciudad(nombre, region_id) VALUES('".$ciudad->nombre."',".intval($ciudad->codRegion).")";
			Database::operacion($query);
		} catch (FatalException $e) {
			if($e->srcCode == 1062) {
				throw new ServiceException('error.registro_ya_existe');
			}
		}
		if(Database::numeroFilasAfectadas() <= 0) {
			new ServiceException('error.validacion.region_no_existe');
		}
	}
	
	/**
	 * Busca una region.
	 * @param Region $region
	 * @return array:Region
	 */
	public function buscarRegion($region) {
		$lista = array();
		$filtro = '';
		if($region != null) {
			if ($region->id != null && is_numeric($region->id)) {
				$filtro .= "id = ".intval($region->id)." AND ";
	        }
	        if ($region->nombre != "") {
	        	$filtro .= "UPPER(nombre) like '".strtoupper($region->nombre)."%' AND ";
	        }
			if ($filtro != "") {
				$filtro = " WHERE ".substr($filtro, 0, -5);	
			}
		}
		
		$query = "SELECT * FROM region".$filtro;
		$result = Database::consulta($query);
		while ($row = Database::obtenerFila($result)) {
			$region = new Region();
			$region->id = $row['id'];
			$region->nombre = $row['nombre'];
			$lista[] = $region;
		}
		
		return $lista;
	}
	
	/**
	 * Busca una ciudad.
	 * @param Ciudad $ciudad
	 * @return array:Ciudad
	 */
	public function buscarCiudad($ciudad) {
		$lista = array();
		$filtro = '';
		if($ciudad != null) {
			if ($ciudad->id != null && is_numeric($ciudad->id)) {
				$filtro .= "id = ".intval($ciudad->id)." AND ";
	        }
			if ($ciudad->codRegion != null && is_numeric($ciudad->codRegion)) {
				$filtro .= "region_id = ".intval($ciudad->codRegion)." AND ";
	        }
	        if ($ciudad->nombre != "") {
	        	$filtro .= "UPPER(nombre) like '".strtoupper($ciudad->nombre)."%' AND ";
	        }
			if ($filtro != "") {
				$filtro = " WHERE ".substr($filtro, 0, -5);	
			}
		}
		
		$query = "SELECT * FROM ciudad".$filtro;
		$result = Database::consulta($query);
		while ($row = Database::obtenerFila($result)) {
			$ciudad = new Ciudad();
			$ciudad->id = $row['id'];
			$ciudad->nombre = $row['nombre'];
			$ciudad->codRegion = $row['region_id'];
			$lista[] = $ciudad;
		}
		
		return $lista;
	}
	
	/**
	 * Actualiza una Region
	 * @param Region $region
	 */
	public function actualizarRegion($region) {
		Validator::validarNoVacio($region, 'region');
		Validator::validarNoVacio($region->id, 'id');
		
		$query = "UPDATE region SET nombre = '".$region->nombre."' "
			."WHERE id = ".intval($region->id);
		Database::operacion($query);
		if(Database::numeroFilasAfectadas() <= 0) {
			new ServiceException('error.validacion.region_no_existe');
		}
	}
	
	/**
	 * Actualiza una Ciudad.
	 * @param Ciudad $ciudad
	 */
	public function actualizarCiudad($ciudad) {
		Validator::validarNoVacio($ciudad, 'ciudad');
		Validator::validarNoVacio($ciudad->id, 'id');
		Validator::validarNumero($ciudad->codRegion, 1, null, 'codRegion');
		
		$query = "UPDATE ciudad SET nombre = '".$ciudad->nombre."', region_id = ".intval($ciudad->codRegion)
			." WHERE id = ".intval($ciudad->id);
		Database::operacion($query);
		if(Database::numeroFilasAfectadas() <= 0) {
			new ServiceException('error.validacion.ciudad_no_existe');
		}
	}
}
?>